package com.io.netty.protocoltcp;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ReplayingDecoder;

import java.util.List;

//每接收一次都会进行一次解码，如果多次进行接收，这个方法就会被多次调用，也就是多次解码
//这个泛型好像是个什么什么状态，一般默认设置为Void就行了
//如果是解码器继承了ReplayingDecoder这个类，好像是会自动判断ByteBuf的对象in中是否还有数据
//就不用写if语句来进行判断，如果是继承ByteToMessageDecoder类来作为解码器
//就需要使用if来判断ByteBuf的对象in中是否还有数据
public class MyMessageDecoder extends ReplayingDecoder<Void> {
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        System.out.println("MyMessageDecoder decode 被调用");
        //需要将得到二进制字节码-> MessageProtocol 数据包(对象)
        //应该是读取缓冲区中int类型的数据长度，就是之前编码的时候放进去的
        int length = in.readInt();

        //根据内容长度，生成对应大小的字节数组
        //就是利用这个解决了读取数据过短或者是过长的问题（解决了tcp的拆包问题）因为这个长度就是数据内容的大小
        //用这个来存放数据包中的内容
        byte[] content = new byte[length];
        //将缓冲区中的数据读到字节数组中
        in.readBytes(content);

        //封装成 MessageProtocol 对象，放入 out， 传递下一个handler业务处理
        MessageProtocol messageProtocol = new MessageProtocol();
        messageProtocol.setLen(length);
        messageProtocol.setContent(content);
        //将解码完成的数据放入list结合中，便于其他handler直接拿到list集合中的数据直接使用
        //编码时要实现的方法中传递的参数有ChannelHandlerContext对象、
        //ByteBuf对象、要编码的数据对象，并将编码好的数据放入缓冲区由通道自动转发
        //解码时要实现的方法中传递的参数有ChannelHandlerContext对象、
        //ByteBuf对象、解码成功后存放数据的对象list集合
        //这个list集合对象应该也会被通道自动转发给下一个handler（猜的）
        out.add(messageProtocol);

    }
}
